#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author  : Leo.W
# @Date    : 2024/1/22 13:24
# @File    : 5-code_structure.py
# @Software: PyCharm

"""
代码控制流程：
if ... elif ... else  语句
for x in [...] / for x in range() 语句
while 语句
match ... case ... 语句 （其它语言中 switch ... case 语句）
"""
import random


def if_test():
    """
    if ... elif ... else 语句
    可有零个或多个 elif 部分，else 部分也是可选的。
    关键字 'elif' 是 'else if' 的缩写，用于避免过多的缩进。
    if ... elif ... elif ... 序列可以当作其它语言中 switch 或 case 语句的替代品。
    """
    x = int(input("Please input a number:"))
    if x < 0:
        print("Negative")
    elif x == 0:
        print("Zero")
    elif x == 1:
        print("Single")
    else:
        print("More")


# if_test()

"""
循环中的 break、continue 语句及 else 子句: 
- break 语句：将跳出最近的一层 for 或 while 循环。
- continue 语句：同样借鉴自 C 语言，继续执行下一次的循环迭代。
- else 子句: 注意：for 或 while 循环可以包括 else 子句
    * 在 for 循环中，else 子句会在循环成功结束最后一次迭代之后执行。
    * 在 while 循环中，它会在循环条件变为假值后执行。
    * 无论哪种循环，如果因为 break 而结束，那么 else 子句就【不会】执行。
"""


def for_test():
    """
    for item in [...] 语句：遍历列表或字符串等任意序列的元素。
    :return:
    """
    # 遍历列表
    arr = [1, "B", 3, "d"]
    for x in arr:
        print(x)

    # 遍历字符串
    strs = "Hello world !"
    for s in strs:
        print(s)

    # 定义一个简单集合(collection，key-value键值对，相当于 map)
    user = {"name": "Tom", "age": 18, "gender": "Man"}
    # 遍历集合(collection)：使用 for key, value in object.items():
    for key, value in user.items():
        print("%s : %s" % (key, value))
    else:  # 注意，for 循环的 else 子语句，待循环执行完毕执行
        print("遍历user结束 -> ", user)

    # 注意：无法在遍历集合(collection)的同时对其进行，最好的办法是遍历集合的克隆体，再修改原集合
    # 方式一：使用 copy() 方法克隆对象获取一个新的集合(collection)进行遍历
    for k, v in user.copy().items():
        if k == "age":
            age = int(input("修改年龄:"))
            user[k] = age
        else:
            continue
    else:  # 注意，for 循环的 else 子语句，待循环执行完毕执行
        print("遍历user.copy()结束 -> ", user)

    # 方式二：新建一个集合(collection)用于保存修改后的集合(collection)
    new_user = {}
    for k, v in user.items():
        if k == "age":
            age = int(input("修改年龄:"))
            new_user[k] = age
        else:
            new_user[k] = v
    print(new_user)

    # for 循环中的 else 子句
    for n in range(2, 10):
        for x in range(2, n):
            if n % x == 0:
                print(n, "equals", x, "*", n // x)
                break
        else:  # 注意，for 循环的 else 子语句，待循环执行完毕执行，break 打断循环【不会】执行else
            print(n, "is a prime number")  # loop fell through without finding a factor


for_test()


def for_range_test():
    """
    for x in range() 遍历
    range(start,end+1,step) 函数：内置函数，用于生成等差数列：
    - range(101)：可以用来产生0到100范围的整数，需要注意的是取不到101。
    - range(1, 101)：可以用来产生1到100范围的整数，相当于前面是闭区间后面是开区间。
    - range(1, 101, 2)：可以用来产生1到100的奇数，其中2是步长，即每次数值递增的值。
    - range(100, 0, -2)：可以用来产生100到1的偶数，其中-2是步长，即每次数字递减的值。
    :return: None
    """
    total = 0
    # 1~100 求和
    for x in range(1, 101):
        total += x
    print("1+2+...+100=", total)

    total = 0
    # 用for循环实现1~100之间的偶数求和
    for x in range(2, 101, 2):  # 从2开始，步长为2
        total += x
    print("2+4+...+100=", total)

    # 要按索引迭代序列，可以组合使用 range() 和 len()：
    stars = ["天枢", "天璇", "天玑", "天权", "玉衡", "开阳", "瑶光"]
    for i in range(len(stars)):
        print(stars[i])


# for_range_test()


def while_test():
    """
    while 循环，猜数字游戏
    :return:
    """
    answer = random.randint(1, 100)
    counter = 0
    while counter < 100:  # while 表达式
        counter += 1
        number = int(input("请输入: "))
        if number < answer:
            print("小一点")
        elif number > answer:
            print("大一点")
        else:
            print("恭喜你猜对了!")
            break  # 跳出 while 循环

    print("你总共猜了%d次" % counter)


# while_test()


def match_test():
    """
    match 语句接受一个表达式并把它的值与一个或多个 case 块给出的一系列模式进行比较。
    相当于其他语言中的 switch-case 语句
    :return:
    """
    status = int(input("input http status code:"))
    match status:
        case 400:
            print("Bad request")
            # 注意此处不需要 break，匹配成功后自动break
        case 404:
            print("Not found")
        case 401 | 403:  # 可以用 | （“或”）将多个字面值组合到一个模式中：
            print("Unauthorized")
        # 添加 if 作为守卫子句。如果守卫子句的值为假，那么 match 会继续尝试匹配下一个 case 块。
        # 注意:先将值捕获，再对守卫子句求值,st 变量就是获取当前的 status 值
        case st if 500 <= st <= 503:
            print("Server error")
        case _:  # 注意最后一个代码块：_ 被作为 通配符,如果没有 case 匹配成功，则执行该分支。相当于其他语言中的 default
            print("None status to match")


# match_test()


def match_tuple():
    """
    形如解包赋值的模式,可被用于绑定变量
    :return:
    """
    arr = [0, 0]
    arr[0] = int(input("请输入X:"))
    arr[1] = int(input("请输入Y:"))

    point = tuple(arr)
    match point:
        case (0, 0):
            print("Origin")
        case (0, y):  # 解构 point 并将第二个参数赋值给变量 y，然后在进行模式匹配验证
            print(f"Y={y}")
        case (x, 0):
            print(f"X={x}")
        case (x, y):  # 解构 point 并将赋值给变量 x,y，然后在进行模式匹配验证
            print(f"X={x},Y={y}")
        case _:
            print(point)


# match_tuple()


"""
pass 语句： 不执行任何动作

while True:
    pass # Busy-wait for keyboard interrupt (Ctrl+C)


# 常用于创建一个最小的类：
class MyEmptyClass:
    pass


# pass 还可用作函数或条件语句体的占位符，让你保持在更抽象的层次进行思考。pass 会被默默地忽略：
def initlog(*args):
    pass  # Remember to implement this!

"""
